package bluenext;

import java.io.IOException;
import lejos.pc.comm.*;

/**
 * Gère les connexions et les recherches de robots NXT.
 * Elle n'est pas accessible en dehors du package et donc par les applications
 * utilisant BlueNeXT.
 *
 * @author Carole Vaudano
 * @version 1.0
 */
class NetworkInterface {

    /** */
    NetworkInterface() {
    }

    /**
     * Recherche tous les NXT existants allumés ou appairés avec le système
     * d'exploitation.
     *
     * @return un tableau contenant les NXT trouvés
     * @throws NXTCommException
     */
    NXTInfo[] search() throws NXTCommException {
        NXTComm nxtComm = NXTCommFactory.createNXTComm(NXTCommFactory.BLUETOOTH);
        NXTInfo[] nxtInfo = nxtComm.search(null, NXTCommFactory.BLUETOOTH);
        return nxtInfo;
    }

    /**
     * Etablit une connection avec un NXT.
     * 
     * @param nxt l'objet représentant le robot avec lequel établir la
     * connexion
     * @return <code>true</code> si la connexion a été établie, <code>false</code> sinon
     * @throws NXTCommException, ErreurNXTException
     */
    boolean connect(NXT nxt) throws ErreurNXTException {
        boolean estConnecte = false;

        if (!nxt.isConnected()) {
            try {
                estConnecte = nxt.getNxtComm().open(nxt.getInfos());
            } catch (NXTCommException e) {
                throw new ErreurNXTException("Connexion deja etablie", ErreurNXTException.ERREUR_CONNEXION);
            }
            nxt.setConnectedState(estConnecte);
        } else {
            throw new ErreurNXTException("Connexion deja etablie", ErreurNXTException.ROBOT_DEJA_CONNECTE);
        }
        return estConnecte;
    }

    /**
     * Ferme la connexion avec un NXT.
     * La communication est fermée et l'attribut représentant l'état de la
     * connexion est mis à <code>false</code>.
     * 
     * @param nxt l'objet représentant le robot dont on souhaite fermer la
     * connexion
     * @throws IOException
     */
    void disconnect(NXT nxt) throws IOException {
        nxt.getNxtComm().close();
        nxt.setConnectedState(false);
    }
}
